অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন (Abstract Interfaces and Procedure Binding)
ফোরট্রানে অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন দুটি শক্তিশালী কৌশল যা কোডের পুনঃব্যবহারযোগ্যতা, নমনীয়তা, এবং একাধিক ফাংশন বা প্রসিডিউরকে পরিচালনা করতে সাহায্য করে। এই কৌশলগুলির মাধ্যমে, আপনি জেনেরিক ফাংশন তৈরি করতে পারেন এবং কোডকে আরও মডুলার এবং পরিষ্কার করতে পারেন।
১. অ্যাবস্ট্রাক্ট ইন্টারফেস (Abstract Interfaces)
অ্যাবস্ট্রাক্ট ইন্টারফেস এমন একটি ইন্টারফেস যা এক বা একাধিক ফাংশন বা প্রসিডিউরের জন্য একটি সাধারণ ঘোষণা বা প্রটোটাইপ প্রদান করে, তবে এই ইন্টারফেসের ভিতরে নির্দিষ্ট কার্যকারিতা বা বাস্তবায়ন (implementation) অন্তর্ভুক্ত থাকে না।
অ্যাবস্ট্রাক্ট ইন্টারফেস ব্যবহৃত হয় যখন বিভিন্ন ফাংশন বা প্রসিডিউর একই নাম ব্যবহার করতে পারে, তবে তাদের বাস্তবায়ন আলাদা হতে পারে। এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এর মতো কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
উদাহরণ:
module abstract_interface
implicit none
contains
! Abstract interface definition
abstract interface
function calculate_area(shape) result(area)
class(*), intent(in) :: shape
real :: calculate_area
end function calculate_area
end interface
end module abstract_interfaceএখানে:
calculate_areaএকটি অ্যাবস্ট্রাক্ট ইন্টারফেস ফাংশন যা বিভিন্ন শেপের জন্য এলাকা গণনা করতে পারে, তবে এটি কোন বিশেষ বাস্তবায়ন নেই।- বাস্তবায়নগুলির জন্য এই ইন্টারফেসকে ব্যবহার করে আরও বিভিন্ন ফাংশন তৈরি করা সম্ভব।
২. প্রোসিডিউর বাঁধন (Procedure Binding)
প্রোসিডিউর বাঁধন হল সেই প্রক্রিয়া যেখানে একটি ফাংশন বা প্রসিডিউর একটি ইন্টারফেসের মাধ্যমে যুক্ত হয়। এটি মূলত ডাইনামিক ফাংশন কল বা জেনেরিক ফাংশন ব্যবহারের জন্য ব্যবহৃত হয়। প্রোসিডিউর বাঁধন প্রোগ্রামের সময় নির্ধারণ করে কোন ফাংশন বা প্রসিডিউরটি কল করা হবে, যখন একই নামের একাধিক ফাংশন বা প্রসিডিউর থাকে।
ফোরট্রানে, প্রোসিডিউর বাঁধন বা জেনেরিক ফাংশন ব্যবহৃত হয় যখন একই নামের একাধিক ফাংশন বা প্রসিডিউর বিভিন্ন টাইপ বা আর্গুমেন্ট নিয়ে কাজ করে।
উদাহরণ:
module procedure_binding
implicit none
contains
! First procedure to calculate area of a circle
function area(radius) result(area)
real, intent(in) :: radius
real :: area
area = 3.14159 * radius**2
end function area
! Second procedure to calculate area of a square
function area(side) result(area)
real, intent(in) :: side
real :: area
area = side**2
end function area
end module procedure_binding
program test_binding
use procedure_binding
real :: circle_area, square_area
! Call the first procedure (circle)
circle_area = area(5.0)
print *, "Area of Circle: ", circle_area
! Call the second procedure (square)
square_area = area(4.0)
print *, "Area of Square: ", square_area
end program test_bindingএখানে:
areaনামক দুটি ভিন্ন ফাংশন আছে, একটি বৃত্তের (circle) এলাকা এবং একটি বর্গের (square) এলাকা বের করার জন্য।- ফোরট্রানে প্রোসিডিউর বাঁধন ব্যবহার করে,
areaফাংশনটি টাইপের ভিত্তিতে বিভিন্ন প্রকারের হিসাব করবে।
৩. অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধনের ব্যবহার
অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন একসাথে ব্যবহার করা হলে, একাধিক কার্যাবলী একই নামের অধীনে আলাদা আলাদা ডেটা টাইপ বা আর্গুমেন্টের জন্য কার্যকরী হতে পারে।
উদাহরণ:
module shape_area
implicit none
type, abstract :: shape
contains
procedure(calculate_area), deferred :: area
end type shape
type, extends(shape) :: circle
real :: radius
end type circle
type, extends(shape) :: square
real :: side
end type square
contains
! Calculate area of a circle
function calculate_area_circle(this) result(area)
class(circle), intent(in) :: this
real :: area
area = 3.14159 * this%radius**2
end function calculate_area_circle
! Calculate area of a square
function calculate_area_square(this) result(area)
class(square), intent(in) :: this
real :: area
area = this%side**2
end function calculate_area_square
end module shape_area
program test_abstract
use shape_area
type(circle) :: c
type(square) :: s
c%radius = 5.0
s%side = 4.0
print *, "Area of Circle: ", c%area()
print *, "Area of Square: ", s%area()
end program test_abstractএখানে:
shapeএকটি অ্যাবস্ট্রাক্ট টাইপ, এবং এর মধ্যে একটি ডেফার্ড প্রোসিডিউর (area) রয়েছে যা ভবিষ্যতে বৃত্ত এবং বর্গের জন্য বাস্তবায়িত হবে।circleএবংsquareটাইপ দুটি extends করেshapeটাইপকে এবং তাদের নিজস্বareaফাংশন প্রদান করে।- প্রোসিডিউর বাঁধন ফাংশনটি টাইপের উপর ভিত্তি করে আলাদা ফাংশন কল করবে।
৪. ফায়দা এবং ব্যবহার
- কোড পুনঃব্যবহারযোগ্যতা: অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন ব্যবহার করে কোড পুনঃব্যবহারযোগ্য হয় এবং একাধিক ধরনের ডেটার জন্য একই নামের ফাংশন বা প্রসিডিউর ব্যবহার করা যায়।
- নমনীয়তা: প্রোগ্রামিং আরও নমনীয় হয়, কারণ আপনি একাধিক কার্যাবলী (যেমন বিভিন্ন শেপের জন্য এলাকা গণনা) একটি সাধারণ ইন্টারফেসের মাধ্যমে পরিচালনা করতে পারেন।
- অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP): অ্যাবস্ট্রাক্ট ইন্টারফেস অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের মতো কাজ করে, যা উন্নত প্রোগ্রামিং কৌশল এবং কোড মডুলারাইজেশনে সহায়তা করে।
উপসংহার
অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন ফোরট্রানে কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক। এগুলি জেনেরিক প্রোগ্রামিং কৌশল যা একাধিক ডেটা টাইপের জন্য একক ইন্টারফেস বা নাম ব্যবহারের মাধ্যমে বিভিন্ন কার্যাবলী সম্পাদন করতে সহায়তা করে, যা কোডের দক্ষতা এবং পরিষ্কারতা নিশ্চিত করে।